From 03d745c8bfbf45df39eb453ff1e7787b856c4368 Mon Sep 17 00:00:00 2001 From: Boris Ostrovsky Date: Mon, 2 Jun 2014 10:20:23 +0200 Subject: [PATCH] x86: correctly report max number of hypervisor leaves MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Commit def0bbd31 provided support for changing max number of hypervisor cpuid leaves (in leaf 0x4000xx00). It also made the hypervisor incorrectly report this number for guests that use default value (i.e. don't specify leaf 0x4000xx00 in config file) Reported-by: Roger Pau Monné Signed-off-by: Boris Ostrovsky --- xen/arch/x86/traps.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 17229121f9..b82b1b345e 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -692,13 +692,19 @@ int cpuid_hypervisor_leaves( uint32_t idx, uint32_t sub_idx, if ( idx > XEN_CPUID_MAX_NUM_LEAVES ) return 0; /* Avoid unnecessary pass through domain_cpuid() */ - /* Number of leaves may be user-specified */ domain_cpuid(d, base, 0, &limit, &dummy, &dummy, &dummy); - limit &= 0xff; - if ( limit < 2 ) - limit = 2; - else if ( limit > XEN_CPUID_MAX_NUM_LEAVES ) + if ( limit == 0 ) + /* Default number of leaves */ limit = XEN_CPUID_MAX_NUM_LEAVES; + else + { + /* User-specified number of leaves */ + limit &= 0xff; + if ( limit < 2 ) + limit = 2; + else if ( limit > XEN_CPUID_MAX_NUM_LEAVES ) + limit = XEN_CPUID_MAX_NUM_LEAVES; + } if ( idx > limit ) return 0; -- 2.30.2